Copyright (c) 2016 Bernoullio
This demo algo illustrates the basic structure of an algorithm.
This includes:
initialize, handle_data, analyze)Bernoullio Lab is built on Jupyter. It also extends the open-source trading engine Zipline.
Visit the respective documentations for further reference.
In [4]:
import warnings
warnings.filterwarnings("ignore")
import toolbox
import zipline
%load_ext zipline
The zipline extension is already loaded. To reload it, use:
%reload_ext zipline
In [6]:
%%zipline --start 2016-6-1 --end 2016-7-28 --bundle bid_ask_stream --data-frequency minute -o performance.pickle
import talib
from zipline.api import record, history, symbol
import logging
from toolbox.broker import SimuBroker
logging.basicConfig(level=logging.DEBUG)
perf_data = None
# initialize algorithm
def initialize(context):
context.broker = SimuBroker(context)
context.blotter = context.broker.blotter
context.sym = symbol("EURUSD")
context.i = 0
def handle_data(context, data):
# Skip first 4500 minutes to get full windows
context.i += 1
if context.i < 4500:
return
# Compute averages
# history() has to be called with the same params
# from above and returns a pandas dataframe.
short_mavg = data.history(context.sym, 'price', 1500, '1m').mean()
long_mavg = data.history(context.sym, 'price', 4500, '1m').mean()
# Trading logic
if short_mavg > long_mavg:
context.broker.create_order(context.sym, 5000)
elif short_mavg < long_mavg:
context.broker.create_order(context.sym, -5000)
# Save values for later inspection
record(EURUSD=data.current(context.sym, "price"),
short_mavg=short_mavg,
long_mavg=long_mavg)
import matplotlib.pyplot as plt
def analyze(context, perf):
# Do additional things to the last context and perf DataFrame
pass
Out[6]:
EURUSD
algo_volatility
algorithm_period_return
alpha
benchmark_period_return
benchmark_volatility
beta
capital_used
ending_cash
ending_exposure
...
short_mavg
short_value
shorts_count
sortino
starting_cash
starting_exposure
starting_value
trading_days
transactions
treasury_period_return
2016-06-01 20:00:00
NaN
NaN
0.000000
NaN
0.001135
NaN
NaN
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
1
[]
0.0185
2016-06-02 20:00:00
NaN
0.000000
0.000000
0.000000
0.003963
0.018966
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
2
[]
0.0181
2016-06-03 20:00:00
NaN
0.000000
0.000000
0.000000
0.001040
0.046796
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
3
[]
0.0171
2016-06-06 20:00:00
NaN
0.000000
0.000000
0.000000
0.005942
0.052564
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
4
[]
0.0173
2016-06-07 20:00:00
NaN
0.000000
0.000000
0.000000
0.007239
0.045543
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
5
[]
0.0172
2016-06-08 20:00:00
NaN
0.000000
0.000000
0.000000
0.010573
0.042486
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
6
[]
0.0171
2016-06-09 20:00:00
NaN
0.000000
0.000000
0.000000
0.008837
0.044034
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
7
[]
0.0168
2016-06-10 20:00:00
NaN
0.000000
0.000000
0.000000
-0.000420
0.071363
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
8
[]
0.0164
2016-06-13 20:00:00
NaN
0.000000
0.000000
0.000000
-0.008531
0.079249
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
9
[]
0.0162
2016-06-14 20:00:00
NaN
0.000000
0.000000
0.000000
-0.010315
0.074841
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
10
[]
0.0162
2016-06-15 20:00:00
NaN
0.000000
0.000000
0.000000
-0.012137
0.071107
0.000000
0.000000e+00
1.000000e+07
0.000000e+00
...
NaN
0.000000e+00
0
NaN
1.000000e+07
0.000000e+00
0.000000e+00
11
[]
0.0160
2016-06-16 20:00:00
112362.0
0.034863
-0.007608
-0.185380
-0.009042
0.070519
-0.136001
1.972316e+08
2.072316e+08
-1.973077e+08
...
112321.313333
-1.973077e+08
1
-4.582576
1.000000e+07
0.000000e+00
0.000000e+00
12
[{'sid': Equity(0 [EURUSD]), 'order_id': '8dd8...
0.0157
2016-06-17 20:00:00
112798.0
0.470222
-0.113958
-1.993680
-0.012270
0.068415
0.975132
3.798314e+08
5.870630e+08
-5.782025e+08
...
112308.537333
-5.782025e+08
1
-4.703512
2.072316e+08
-1.973077e+08
-1.973077e+08
13
[{'sid': Equity(0 [EURUSD]), 'order_id': '8dd8...
0.0162
2016-06-20 20:00:00
113053.0
0.540004
-0.183558
-3.575547
-0.006533
0.071697
-0.828095
4.163070e+08
1.003370e+09
-9.952056e+08
...
112591.849333
-9.952056e+08
1
-6.162852
5.870630e+08
-5.782025e+08
-5.782025e+08
14
[{'sid': Equity(0 [EURUSD]), 'order_id': '3523...
0.0167
2016-06-21 20:00:00
112483.0
2.870632
0.367500
8.503968
-0.003839
0.070300
6.623734
4.594235e+08
1.462793e+09
-1.449118e+09
...
112659.238000
-1.449118e+09
1
14.832775
1.003370e+09
-9.952056e+08
-9.952056e+08
15
[{'sid': Equity(0 [EURUSD]), 'order_id': '972f...
0.0171
2016-06-22 20:00:00
112981.0
3.398514
-0.265469
1.049916
-0.005484
0.068145
8.937027
4.349499e+08
1.897743e+09
-1.890398e+09
...
112887.807333
-1.890398e+09
1
0.154590
1.462793e+09
-1.449118e+09
-1.449118e+09
16
[{'sid': Equity(0 [EURUSD]), 'order_id': '972f...
0.0169
2016-06-23 20:00:00
113735.0
7.568544
NaN
-20.615377
0.007807
0.084471
-44.928264
4.172563e+08
2.315000e+09
-2.320649e+09
...
113093.630000
-2.320649e+09
1
-3.675534
1.897743e+09
-1.890398e+09
-1.890398e+09
17
[{'sid': Equity(0 [EURUSD]), 'order_id': '31fa...
0.0174
2016-06-24 20:00:00
111082.0
36.549936
NaN
-89.142576
-0.028394
0.158920
181.089443
6.012405e+08
2.916240e+09
-2.867249e+09
...
112619.695333
-2.867249e+09
1
-4.341455
2.315000e+09
-2.320649e+09
-2.320649e+09
18
[{'sid': Equity(0 [EURUSD]), 'order_id': 'ea70...
0.0157
2016-06-27 20:00:00
110172.0
35.747441
0.080157
-54.730704
-0.045976
0.165781
148.341097
5.828141e+08
3.499054e+09
-3.427010e+09
...
111948.232667
-3.427010e+09
1
-4.051591
2.916240e+09
-2.867249e+09
-2.867249e+09
19
[{'sid': Equity(0 [EURUSD]), 'order_id': 'eece...
0.0146
2016-06-28 20:00:00
110798.0
34.809267
-0.228827
-96.668094
-0.029023
0.176562
126.265741
4.819432e+08
3.980997e+09
-3.929562e+09
...
111278.877333
-3.929562e+09
1
-4.050436
3.499054e+09
-3.427010e+09
-3.427010e+09
20
[{'sid': Equity(0 [EURUSD]), 'order_id': '7eb1...
0.0146
2016-06-29 20:00:00
111057.0
33.953950
-0.365983
-121.725136
-0.012485
0.183570
113.491107
4.770275e+08
4.458025e+09
-4.415737e+09
...
110736.346000
-4.415737e+09
1
-4.014724
3.980997e+09
-3.929562e+09
-3.929562e+09
21
[{'sid': Equity(0 [EURUSD]), 'order_id': 'd048...
0.0150
2016-06-30 20:00:00
110975.0
33.197512
-0.331203
-133.071228
0.000911
0.185392
108.784771
6.099767e+08
5.068002e+09
-5.023394e+09
...
110651.441333
-5.023394e+09
1
-3.903571
4.458025e+09
-4.415737e+09
-4.415737e+09
22
[{'sid': Equity(0 [EURUSD]), 'order_id': 'fb40...
0.0149
2016-07-01 20:00:00
111322.0
32.439154
-0.562597
-133.397995
0.002861
0.181232
108.766401
4.800717e+08
5.548073e+09
-5.518899e+09
...
110959.904667
-5.518899e+09
1
-3.931608
5.068002e+09
-5.023394e+09
-5.023394e+09
23
[{'sid': Equity(0 [EURUSD]), 'order_id': '5c01...
0.0146
2016-07-05 20:00:00
110701.0
32.150917
-0.082080
-108.631188
-0.004006
0.178708
103.278760
4.663175e+08
6.014391e+09
-5.953168e+09
...
111047.892000
-5.953168e+09
1
-3.487661
5.548073e+09
-5.518899e+09
-5.518899e+09
24
[{'sid': Equity(0 [EURUSD]), 'order_id': '1971...
0.0137
2016-07-06 20:00:00
111010.0
31.477745
-0.347061
-112.747792
0.001326
0.175802
102.547993
5.146959e+08
6.529087e+09
-6.485537e+09
...
110992.332667
-6.485537e+09
1
-3.508680
6.014391e+09
-5.953168e+09
-5.953168e+09
25
[{'sid': Equity(0 [EURUSD]), 'order_id': '3f1d...
0.0138
2016-07-07 20:00:00
110629.0
30.983593
-0.010625
-102.544594
0.000453
0.172277
102.209931
4.603970e+08
6.989484e+09
-6.923495e+09
...
110934.020667
-6.923495e+09
1
-3.277859
6.529087e+09
-6.485537e+09
-6.485537e+09
26
[{'sid': Equity(0 [EURUSD]), 'order_id': '74c2...
0.0140
2016-07-08 20:00:00
110529.0
30.418662
0.078402
-111.671130
0.015713
0.175180
97.306680
4.515221e+08
7.441006e+09
-7.369079e+09
...
110696.990667
-7.369079e+09
1
-3.188707
6.989484e+09
-6.923495e+09
-6.923495e+09
27
[{'sid': Equity(0 [EURUSD]), 'order_id': '4756...
0.0137
2016-07-11 20:00:00
110569.0
29.867712
0.036627
-111.028000
0.019175
0.172107
97.367926
3.676331e+08
7.808639e+09
-7.739498e+09
...
110623.128667
-7.739498e+09
1
-3.143009
7.441006e+09
-7.369079e+09
-7.369079e+09
28
[{'sid': Equity(0 [EURUSD]), 'order_id': '4756...
0.0143
2016-07-12 20:00:00
110622.0
29.345101
-0.009502
-113.387061
0.026319
0.170014
96.827784
4.690067e+08
8.277646e+09
-8.211582e+09
...
110593.070667
-8.211582e+09
1
-3.101615
7.808639e+09
-7.739498e+09
-7.739498e+09
29
[{'sid': Equity(0 [EURUSD]), 'order_id': '22a9...
0.0153
2016-07-13 20:00:00
110936.0
28.834728
-0.353602
-112.630145
0.026457
0.167074
96.805773
4.213600e+08
8.699006e+09
-8.655892e+09
...
110709.652000
-8.655892e+09
1
-3.149639
8.277646e+09
-8.211582e+09
-8.211582e+09
30
[{'sid': Equity(0 [EURUSD]), 'order_id': '9be1...
0.0148
2016-07-14 20:00:00
111153.0
28.350266
-0.608130
-116.177663
0.031856
0.164730
96.213764
3.546445e+08
9.053650e+09
-9.027513e+09
...
110886.407333
-9.027513e+09
1
-3.209650
8.699006e+09
-8.655892e+09
-8.655892e+09
31
[{'sid': Equity(0 [EURUSD]), 'order_id': '9be1...
0.0153
2016-07-15 20:00:00
110691.0
28.339126
-0.046325
-100.254014
0.030897
0.162148
95.029048
4.241168e+08
9.477767e+09
-9.414159e+09
...
110909.794000
-9.414159e+09
1
-2.751677
9.053650e+09
-9.027513e+09
-9.027513e+09
32
[{'sid': Equity(0 [EURUSD]), 'order_id': '4881...
0.0160
2016-07-18 20:00:00
110725.0
27.901660
-0.092421
-99.327292
0.033353
0.159640
95.079954
6.862014e+08
1.016397e+10
-1.010343e+10
...
110897.930000
-1.010343e+10
1
-2.723158
9.477767e+09
-9.414159e+09
-9.414159e+09
33
[{'sid': Equity(0 [EURUSD]), 'order_id': '4740...
0.0159
2016-07-19 20:00:00
110169.0
27.647526
0.666056
-88.952191
0.031870
0.157347
94.065829
6.948008e+08
1.085877e+10
-1.074765e+10
...
110656.690000
-1.074765e+10
1
-2.452408
1.016397e+10
-1.010343e+10
-1.010343e+10
34
[{'sid': Equity(0 [EURUSD]), 'order_id': '35bf...
0.0156
2016-07-20 20:00:00
110149.0
27.247897
0.688196
-89.197811
0.036277
0.155269
94.030936
6.620718e+08
1.152084e+10
-1.140824e+10
...
110384.810667
-1.140824e+10
1
-2.413508
1.085877e+10
-1.074765e+10
-1.074765e+10
35
[{'sid': Equity(0 [EURUSD]), 'order_id': 'efaa...
0.0159
2016-07-21 20:00:00
110198.0
26.861105
0.599730
-84.499077
0.032533
0.153534
93.140146
7.588795e+08
1.227972e+10
-1.217302e+10
...
110245.129333
-1.217302e+10
1
-2.393758
1.152084e+10
-1.140824e+10
-1.140824e+10
36
[{'sid': Equity(0 [EURUSD]), 'order_id': '4fe7...
0.0157
2016-07-22 20:00:00
109739.0
26.553364
1.366474
-81.948689
0.037235
0.151681
93.558385
6.821353e+08
1.296186e+10
-1.280402e+10
...
110013.908667
-1.280402e+10
1
-2.234519
1.227972e+10
-1.217302e+10
-1.217302e+10
37
[{'sid': Equity(0 [EURUSD]), 'order_id': 'e9f8...
0.0157
2016-07-25 20:00:00
109921.0
26.193157
1.044217
-78.695643
0.034111
0.149979
92.997004
2.921313e+08
1.325399e+10
-1.311764e+10
...
109941.818667
-1.311764e+10
1
-2.240221
1.296186e+10
-1.280402e+10
-1.280402e+10
38
[{'sid': Equity(0 [EURUSD]), 'order_id': '4d7b...
0.0158
2016-07-26 20:00:00
109873.0
25.855209
1.130538
-76.585634
0.034445
0.148001
92.939177
3.314062e+08
1.358539e+10
-1.344329e+10
...
109892.096667
-1.344329e+10
1
-2.200445
1.325399e+10
-1.311764e+10
-1.311764e+10
39
[{'sid': Equity(0 [EURUSD]), 'order_id': '9de5...
0.0157
2016-07-27 20:00:00
110527.0
25.537368
-0.098607
-77.625560
0.033205
0.146187
93.039702
4.552879e+08
1.404068e+10
-1.398056e+10
...
109873.098000
-1.398056e+10
1
-2.315443
1.358539e+10
-1.344329e+10
-1.344329e+10
40
[{'sid': Equity(0 [EURUSD]), 'order_id': '9de5...
0.0152
2016-07-28 20:00:00
110763.0
25.224585
-0.541686
-79.655775
0.034865
0.144360
92.966294
3.524149e+08
1.439310e+10
-1.436253e+10
...
110165.254000
-1.436253e+10
1
-2.407248
1.404068e+10
-1.398056e+10
-1.398056e+10
41
[{'sid': Equity(0 [EURUSD]), 'order_id': 'e562...
0.0152
41 rows × 41 columns
In [7]:
import pandas as pd
data = pd.read_pickle('performance.pickle') # read in perf DataFrame
# start mode to work cleanly with matplotlib figures
%pylab inline
figsize(12, 12)
# Import our choice graphing library.
# Visit http://matplotlib.org/users/beginner.html for instructions on drawing beautiful graphs
import matplotlib.pyplot as plt
# plot portfolio value
ax1 = plt.subplot(211)
data.portfolio_value.plot(ax=ax1)
ax1.set_ylabel('Portfolio value')
# plot the long and short mavg
ax2 = plt.subplot(212, sharex=ax1)
data.long_mavg.plot(ax=ax2)
ax2.set_ylabel("long_mavg")
ax3 = plt.subplot(212, sharex=ax1)
data.short_mavg.plot(ax=ax3)
ax2.set_ylabel("short_mavg")
Populating the interactive namespace from numpy and matplotlib
Out[7]:
<matplotlib.text.Text at 0x7f6104330470>
In [ ]:
Content source: bernoullio/lab
Similar notebooks: